<?php

/**
 * Access_AccessObject - Objet de gestion des accès utilisateurs
 *
 * @package
 * @author Alexis Eric, 
 * Erra Prod. http://www.erraprod.com
 * @copyright Copyright (c) 2012 - Erra Prod
 * @access public
 */
class Access_AccessObject extends Erra_Fields_Base_Object {

    public static $_typePrestations = array();

    function __construct($objectId, $buildArgs = null) {
        parent::__construct($objectId, $buildArgs);
        $email = Erra_Fields_Text::create('email')
                ->setDescription('Adresse e-mail * (utilisée comme identifiant)')
                ->setInAdminList(true)
                ->setDatabaseType('VARCHAR', 128);

        $nom = Erra_Fields_Text::create('nom')
                ->setDescription("Nom *")
                ->setInAdminList(true)
                ->setDatabaseType('VARCHAR', 64)
                ->setSize(40);

        $prenom = Erra_Fields_Text::create('prenom')
                ->setDescription("Prénom *")
                ->setDatabaseType('VARCHAR', 64)
                ->setSize(40);

        $portable = Erra_Fields_Text::create('portable')
                ->setDatabaseType('VARCHAR', 32)
                ->setDescription('Portable');

        $mot_de_passe = Erra_Fields_Password::create('mot_de_passe')
                ->setDatabaseType('VARCHAR', 256)
                ->setDescription('Mot de passe *');

        $mot_de_passe_confirm = Erra_Fields_Password::create('mot_de_passe_confirm')
                ->setDatabaseType('VARCHAR', 256)
                ->setDescription('Confirmation du mot de passe *');

        $is_admin = Erra_Fields_Hidden::create('is_admin')
                ->setDatabaseType('TINYINT')
                ->setValue(0);
        
        // Si l'utilisateur édite son profil, on met son email en champ hidden, comme ça il ne peut pas la changer
        if ($buildArgs == 'edit-profile') {
            $email = Erra_Fields_Hidden::create('email');
            $this->setDescription('Editer vos informations');
            $this->setRenderEngine('jqueryui');
            $this->setAttribute('style', 'width:400px;');
            // Enregistrement du compte root
        } else if ($buildArgs == 'register-super-admin') {
            $is_admin = Erra_Fields_Hidden::create('is_admin')
                    ->setValue(3);
            $this->setDescription('Créér accès super-administrateur');
            $this->setAttribute('style', 'width:350px;');
            $this->setRenderEngine('jqueryui');
        } else {
            $this->setDescription('Accès utilisateur');
        }
        $this->addFields($email, $nom, $prenom, $portable, $mot_de_passe, $mot_de_passe_confirm, $is_admin);
        $agendas = Erra_Fields_Hidden::create('agendas');
        $this->addField($agendas);
        $this->append('* Champs obligatoires');
        $this->setAddText('Cliquez ici pour ajouter un accès utilisateur');
    }

    /**
     * getAccessTree() - Renvoie l'abre des accès utilisateurs
     * @return Array 
     */
    public static function getAccessTree() {
        $resultArray = array();
        $accesses = Erra_Core_DatabasePdo::SELECT('SELECT email, id FROM access_accessobject');
        if (Erra_Core_DatabasePdo::rowCount()) {
            while ($row = $accesses->fetch()) {
                $resultArray[] = array('title' => $row->email, 'key' => $row->id);
            }
        }
        return array('title' => 'Accès utilisateur',
            'expand' => true, 'children' => $resultArray);
    }

    /*
     * postInit() - Action executée après la récupération des données en base
     */
    public function postInit() {
        $loggedId = Access_ControlObject::get('id');
        // On inscrit l'adresse e-mail de l'utilisateur si il est en mode 'édition de profil'
        if (get_class($this->email) == 'Erra_Fields_Hidden') {
            $this->email->prepend('<br/>Adresse e-mail : ' . $this->email->value);
        }
        // Seul le superadmin a la possibilité de créér des administrateurs
        if (Access_ControlObject::isSuperAdmin()) {
            $is_admin = Erra_Fields_ComboBox::create('is_admin')
                    ->setDescription('Niveau de droits')
                    ->fill(array(0 => 'Simple employé', 1 => 'Manager', 2=>'Administrateur'))
                    ->setValue($this->is_admin->value);
            $this->addFields($is_admin);
        } 

        // L'attribution des agendas ne se fait pas en mode inscription
        if (Access_ControlObject::is_logged() && strstr($this->getBuildArgs(), 'register') === FALSE) {
            $agendaArray = Msa_AgendaObject::getAuthorizedAgendaTree();
            $agendas = Erra_Fields_Tree::create('agendas')
                    ->setDescription('Agendas actifs (affichables dans le calendrier)')
                    ->fill($agendaArray);
            $this->addFields($agendas);

            // Si l'utilisateur consulte sa propre fiche, on assigne ses agendas à partir de la fonction interne
            if ($this->getId() == $loggedId) {
                $this->agendas->setRawData(implode('§', Msa_AgendaObject::getEnabledAgendaArray()));
            } else {
                // Sinon, on calcule les droits de l'utilisateur en cours
                $resultAgendaArray = array();
                $agendas = Erra_Core_DatabasePdo::SELECT('SELECT agenda_id FROM back_agenda_access WHERE access_id=' . $this->getId());
                if (Erra_Core_DatabasePdo::rowCount()) {
                    while ($row = $agendas->fetch()) {
                        $resultAgendaArray[] = $row->agenda_id;
                    }
                    $this->agendas->setRawData(implode('§', $resultAgendaArray));
                }
            }
        }
    }

    /*
     * postListInit() - On supprime l'utilisateur de la liste (pour pas qu'il puisse se supprimer lui même)
     * On supprime également le superadmin de la liste
     */
    public function postListInit() {
        $login_infos = Erra_Persistance_Session::get('login_infos');
        $id = '';
        if (is_object($login_infos)) {
            $id = Access_ControlObject::get('id');
        }
        // On récupère l'identifiant du super admin
        $superAdmin = Erra_Core_DatabasePdo::SELECT('SELECT object_id FROM access_accessobject WHERE is_admin=3')->fetch();
        $super_admin_id = $superAdmin->object_id;
        $list = $this->getObjectDataArray();
        $newObjectArray = array();
        foreach ($list as $item) {
            if ($item['id'] != $id && $item['object_id'] != $super_admin_id) {
                $newObjectArray[] = $item;
            }
        }
        $this->setObjectDataArray($newObjectArray);
    }
}